package single1;


/**
 * 双检锁 降低锁的颗粒度
 *
 * 给代码块加锁 而不是整个方法
 *
 *
 * volatile修饰符适用于以下场景：某个属性被多个线程共享，其中有一个线程修改了此属性，
 * 其他线程可以立即得到修改后的值
 *
 *
 * 缺点：还是需要加锁，线程会阻塞
 *
 *
 */
public class Single4 {

    private Single4(){}

    public static volatile Single4 single4 = null;

    public static Single4 getInstance(){
        if(single4==null){
            synchronized (Single4.class){
                if(single4==null){
                    return new Single4();
                }
            }
        }
        return single4;
    }
}
